<?php
/**
 * 관리자 헤더에 플러그인에서 필요한 스타일시트를 로드한다.
 *
 * @author cwsong
 * @since 0.1
 */
function schedule_admin_print_styles() {
    wp_enqueue_style("fullcalendar_css", constant(EPART_SCHEDULE_NAME_U."_PLUGIN_CSS_URL") . "/"."fullcalendar.css");
    wp_enqueue_style("colorpicker_css", WP_PLUGIN_URL . "/epart-common/css/colorpicker.css");
    wp_enqueue_style("jqueryui_css", WP_PLUGIN_URL . "/epart-common/css/jquery-ui-1.8.11.custom.css");
    wp_enqueue_style(EPART_SCHEDULE_NAME."_admin_css", constant(EPART_SCHEDULE_NAME_U."_PLUGIN_CSS_URL") . "/".EPART_SCHEDULE_NAME."-admin.css");
}

/**
 * 관리자 스크립트를 출력한다.
 *
 * @author cwsong
 * @since 0.2
 */
function schedule_admin_print_scripts() {
    wp_enqueue_script("jquery");
    wp_enqueue_script(EPART_SCHEDULE_NAME."_admin_script_handle", constant(EPART_SCHEDULE_NAME_U."_PLUGIN_JS_URL") . "/".EPART_SCHEDULE_NAME."-admin.js", array("jquery"));
    wp_enqueue_script("jqueryui_script_handle",WP_PLUGIN_URL . "/epart-common/js/jquery-ui-1.8.11.custom.min.js");
    wp_enqueue_script("fullcalendar_script_handle", constant(EPART_SCHEDULE_NAME_U."_PLUGIN_JS_URL") . "/"."fullcalendar.min.js");
    wp_enqueue_script("colorpicker_script_handle", WP_PLUGIN_URL . "/epart-common/js/colorpicker.js");
    wp_enqueue_script("formatdate_script_handle", WP_PLUGIN_URL . "/epart-schedule/js/formatdate.js");
    wp_localize_script(EPART_SCHEDULE_NAME."_admin_script_handle", EPART_SCHEDULE_NAME."Settings", array(
        "ajaxurl" => admin_url("admin-ajax.php")
        , EPART_SCHEDULE_NAME."_version_update_nonce" => wp_create_nonce(EPART_SCHEDULE_NAME."-version-update-nonce")
        , EPART_SCHEDULE_NAME."_update_day_nonce" => wp_create_nonce(EPART_SCHEDULE_NAME."-update-day-nonce")
        , EPART_SCHEDULE_NAME."_category_del_nonce" => wp_create_nonce(EPART_SCHEDULE_NAME."-category-del-nonce")
        , EPART_SCHEDULE_NAME."_category_update_nonce" => wp_create_nonce(EPART_SCHEDULE_NAME."-category-update-nonce")
        , EPART_SCHEDULE_NAME."_category_add_nonce" => wp_create_nonce(EPART_SCHEDULE_NAME."-category-add-nonce")
    ));
}

/**
 * 사이드바 관리자 메뉴를 추가한다.
 *
 * @author cwsong
 * @since 0.1
 */
function schedule_admin_menu() {
    //해당 플러그인 관리자 페이지에서만 스타일과 스크립트가 로드되도록 suffix를 이용한다
    $page = add_menu_page("일정관리", "일정관리", "administrator", EPART_SCHEDULE_NAME."-admin", EPART_SCHEDULE_NAME."_admin_page");
    add_action("admin_print_styles-$page", EPART_SCHEDULE_NAME."_admin_print_styles");
    add_action("admin_print_scripts-$page", EPART_SCHEDULE_NAME."_admin_print_scripts");
}

/**
 * 관리자 화면을 출력한다.<br />
 * 파라메터 <var>mode</var> 에 해당하는 관리자화면을 보여준다.
 *
 * @author cwsong
 * @since 0.2
 */
function schedule_admin_page() {
    global $table_prefix, $wpdb;
    if (!current_user_can('manage_options')) {
        wp_die(__('페이지에 대한 접근 관한이 없습니다.'));
    }

    $title = '일정관리';
    $add_db_url = admin_url("admin.php") . '?page='.EPART_SCHEDULE_NAME.'-admin&mode=add_db&noheader=true';
    $update_db_url = admin_url("admin.php") . '?page='.EPART_SCHEDULE_NAME.'-admin&mode=update_db&noheader=true';
    //noheader=true : 워드프레스 관리자 공용헤더를 출력되지 않게한다. method=post일때 사용.noheader=true는 get파라메터로 붙어있어야한다.
    $delete_db_url = admin_url("admin.php") . '?page='.EPART_SCHEDULE_NAME.'-admin&mode=delete_db&noheader=true';
    $list_url = admin_url("admin.php") . '?page='.EPART_SCHEDULE_NAME.'-admin';
    if (isset($_GET["sk_cateno"]) && $_GET["sk_cateno"]) {
        $list_url .= "&sk_cateno=" . $_GET["sk_cateno"];
        $add_db_url .= "&sk_cateno=" . $_GET["sk_cateno"];
        $update_db_url .= "&sk_cateno=" . $_GET["sk_cateno"];
    }

    if (isset($_REQUEST['mode'])) {
        switch ($_REQUEST['mode']) {            
            case 'add_db':
                //입력 검증
                schedule_validate_add_update_form($_POST);

                try {
                    if (tx_begin ()) {                        
                        $es_no = schedule_add($_POST);
                        tx_commit();
                    } else {
                        throw new Exception("[트랜잭션 생성실패]");
                    }
                } catch (Exception $exc) {
                    tx_rollback("row를 추가하지 못하였습니다." . $exc->getMessage());
                }
                //목록으로 리다이렉트
                $goToList = add_query_arg('row_added', 'true', $list_url);
                wp_redirect($goToList);
                exit;            
            case 'update_db':
                //입력 검증
                schedule_validate_add_update_form($_POST);
                //일정 수정하고
                schedule_update($_POST);
                //목록으로 리다이렉트
                $goToList = add_query_arg('row_updated', 'true', $list_url);
                wp_redirect($goToList);
                exit;
            case 'delete_db':
                //입력 검증
                schedule_validate_delete_form($_POST);
                //일정 삭제하고
                schedule_delete($_POST);
                //목록으로 리다이렉트
                $goToList = add_query_arg('row_deleted', 'true', $list_url);
                wp_redirect($goToList);
                exit;           
            default:                
                break;
        }
    }

    echo schedule_process_message("added", "추가");
    echo schedule_process_message("updated", "수정");
    echo schedule_process_message("deleted", "삭제");

    // 카테고리 객체 생성
    $category_obj = get_category_list();

    //관리자단 공통 레이아웃
    echo '
        <div class="wrap">
            <div class="icon-'.EPART_SCHEDULE_NAME.'" id="icon-'.EPART_SCHEDULE_NAME.'-admin"></div>
                <h2 class="plugin-title">' . $title . /*' <a href="#TB_inline&width=420&height=420&inlineId=add-category" title="카테고리 관리" id="a-event-category" class="button add-new-h2 thickbox">카테고리 관리</a>*/'</h2>
    ';

    if (isset($_GET['mode'])) {
        switch ($_GET['mode']) {
            case 'show_category':
                include_once EPART_SCHEDULE_NAME.'-admin-calendar.php';
                break;
            default:
                wp_die('지원하지 않는 기능입니다.');
                break;
        }
    } else {
        include_once EPART_SCHEDULE_NAME.'-admin-calendar.php';
    }

    echo '</div>';
}

/**
 * 추가, 수정, 삭제 안내메세지를 출력한다.
 *
 * @author cwsong
 * @since 0.3
 * @param string $param 체크할 파라메터 접미어
 * @param string $str 출력할 안내메세지종류
 * @return str 안내메세지 문자열
 */
function schedule_process_message($param = null, $str = null) {
    if (is_null($param) or is_null($str)) {
        wp_die("메세지생성에 필요한 인수가 바르게 입력되지 않았습니다.");
    }
    if (isset($_GET["row_" . $param]) && $_GET["row_" . $param] == 'true') {
        return "<div id='".EPART_SCHEDULE_NAME."_admin_warning' class='updated fade'>
                <p>
                    일정을 " . $str . "하였습니다.
                </p>
            </div>";
    }
}

/**
 * row 추가시 입력 데이터를 검증한다.
 *
 * @since 0.3
 * @author cwsong
 * @param array $post
 */
function schedule_validate_add_update_form($post) {
    //nonce검증
    check_admin_referer(EPART_SCHEDULE_NAME."-add-update");
    if (!trim($post["ev_title"])) {
        wp_die("제목을 입력해주세요.");
    }
    if (!trim($post["ev_startday"])) {
        wp_die("시작일을 입력해주세요.");
    }
    if (!trim($post["ev_endday"])) {
        wp_die("종료일을 입력해주세요.");
    }

    $startday_arr = explode("-", $post["ev_startday"]);
    $endday_arr = explode("-", $post["ev_endday"]);
    $start_timestamp = mktime($post["ev_starthour"], $post["ev_startminute"], "00", $startday_arr[1], $startday_arr[2], $startday_arr[0]);
    $end_timestamp = mktime($post["ev_endhour"], $post["ev_endminute"], "00", $endday_arr[1], $endday_arr[2], $endday_arr[0]);

    if($start_timestamp > $end_timestamp){
        wp_die("종료일이 시작일 이전일 수 없습니다.");
    }
}

/**
 * 삭제 입력데이터를 겁증한다.
 *
 * @author cwsong
 * @since 0.3
 * @param array $post
 */
function schedule_validate_delete_form($post) {
    //nonce검증
    check_admin_referer(EPART_SCHEDULE_NAME."-add-update");
    if (empty($post['ev_no'])) {
        wp_die("삭제할 것을 선택해주세요.");
    }
}

/**
 * row 추가한다.<br />
 * 추가후 입력된 row pk를 반환한다.
 *
 * @global wpdb $wpdb wpdb
 * @param array $post insert 정보 배열
 * @return int 추가된 row pk
 */
function schedule_add($post) {
    global $wpdb;
    $wpdb->insert("wp_".EPART_SCHEDULE_NAME, array(
        "ev_title" => $post["ev_title"]
        , "ev_blogid"  => get_current_blog_id()
        , "ev_startday"  => $post["ev_startday"]." ".$post["ev_starthour"].":".$post["ev_startminute"]
        , "ev_endday"   => $post["ev_endday"]." ".$post["ev_endhour"].":".$post["ev_endminute"]
        , "ev_location" => $post["ev_location"]
        , "ev_content"  => $post["ev_content"]
        , "ev_color"    => $post["ev_color"]
        , "ev_repeat"   => $post["ev_repeat"]
        , "ev_cateno"   => $post["ev_cateno"]
        
    ));
    return $wpdb->insert_id;
}

/**
 * row 수정한다.<br />
 *
 * @global wpdb $wpdb wpdb
 * @param array $post row 수정정보
 * @return boolean 수정완료결과
 */
function schedule_update($post) {
    global $wpdb;
    if (tx_begin ()) {
        try {
            $wpdb->update("wp_".EPART_SCHEDULE_NAME, array(
                "ev_title" => $post["ev_title"]               
                , "ev_startday"  => $post["ev_startday"]." ".$post["ev_starthour"].":".$post["ev_startminute"]
                , "ev_endday"   => $post["ev_endday"]." ".$post["ev_endhour"].":".$post["ev_endminute"]
                , "ev_location" => $post["ev_location"]
                , "ev_content"  => $post["ev_content"]
                , "ev_color"    => $post["ev_color"]
                , "ev_repeat"   => $post["ev_repeat"]
                , "ev_cateno"   => $post["ev_cateno"]
                ), array(
                'ev_no' => $post['ev_no']
            ));           

            return tx_commit();
        } catch (Exception $exc) {
            tx_rollback("데이터 수정에 실패했습니다.");
        }
    }
}

/**
 * row 삭제한다.<br />
 *
 * @author cwsong
 * @since 0.3
 * @global wpdb $wpdb 워드프레스 디비매니저클래스 
 * @param array $post 삭제할 게시판정보
 */
function schedule_delete($post) {
    global $wpdb;
    if (tx_begin ()) {
        try {            
            $wpdb->query("DELETE FROM wp_".EPART_SCHEDULE_NAME." WHERE ev_no = " . $post['ev_no']);
            tx_commit();
        } catch (Exception $exc) {
            tx_rollback("삭제하지 못하였습니다.");
        }
    }
}
?>
